package com.cotasul.persistencia;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import com.cotasul.bean.CotacaoBean;
import com.cotasul.bean.FormaPagamentoBean;
import com.cotasul.bean.FornecedorBean;
import com.cotasul.bean.ItemOrcamentoBean;
import com.cotasul.bean.OrcamentoBean;
import com.cotasul.bean.ProdutoBean;
import com.cotasul.bean.TipoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.persistencia.config.GerenciadorConexao;
import com.cotasul.persistencia.config.SQLConfiguracao;
import com.cotasul.persistencia.enums.EnumCondicao;
import com.cotasul.persistencia.interfaces.IFornecedorDao;

public class FornecedorDao<P extends FornecedorBean> extends DaoGenerico<P>
		implements IFornecedorDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void alterar(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public Map<String, Long> salvar(P p) throws Exception {
		long codForn = 0;
		long codUser = 0;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_fornecedor");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codForn = rs.getLong("MAXCOD");
			}
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_usuario");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codUser = rs.getLong("MAXCOD");
			}
			query = SQLConfiguracao.getInstance().getValor("insere_usuario");
			ps = conn.prepareStatement(query);
			ps.setLong(1, codUser);
			ps.setString(2, p.getUsuario().getLogin());
			ps.setString(3, p.getUsuario().getSenha());
			ps.setString(4, "Fornecedor");
			ps.setString(5, p.getUsuario().getCidade().toUpperCase());
			ps.setString(6, p.getUsuario().getUf().toUpperCase());
			ps.setString(7, p.getUsuario().getEndereco().toUpperCase());
			ps.execute();
			conn.commit();

			query = SQLConfiguracao.getInstance().getValor("insere_fornecedor");
			ps = conn.prepareStatement(query);
			ps.setLong(1, codForn);
			ps.setString(2, p.getNome());
			ps.setString(3, p.getFone());
			ps.setString(4, p.getFone2());
			ps.setString(5, p.getContato());
			ps.setString(6, p.getEmail());
			ps.setString(7, p.getCnpj());
			ps.setLong(8, p.getTipo().getCodigo());
			ps.setLong(9, codUser);
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			conn.rollback();
			throw e;
		} finally {
			ps.close();
			rs.close();
		}

		return null;
	}

	public FornecedorBean buscaFornecedor(P p) throws Exception {

		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_fornecedor");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getUsuario().getCodigo());
			rs = ps.executeQuery();
			if (rs.next()) {
				p.setCnpj(rs.getString("CNPJ"));
				p.setCodigo(rs.getLong("IDFORN"));
				p.setContato(rs.getString("CONTATO"));
				p.setEmail(rs.getString("EMAIL"));
				p.setFone(rs.getString("FONE"));
				p.setFone2(rs.getString("FONE2"));
				p.setNome(rs.getString("RAZAO"));
				TipoBean tipo = new TipoBean();
				tipo.setCodigo(rs.getLong("IDTIPO"));
				p.setTipo(tipo);
			}

		} catch (Exception e) {
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}

		return p;
	};

	public List<FornecedorBean> buscaFornecedorTipo(Long tipo) throws Exception {
		List<FornecedorBean> listaFornecedor = new ArrayList<FornecedorBean>();
		FornecedorBean fornecedor = null;
		TipoBean tipoBean = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_fornecedor_tipo");
			ps = conn.prepareStatement(query);
			ps.setLong(1, tipo);
			rs = ps.executeQuery();
			while (rs.next()) {
				tipoBean = new TipoBean();
				tipoBean.setCodigo(rs.getLong("IDTIPO"));
				tipoBean.setDescricao(rs.getString("DESCRICAO"));
				fornecedor = new FornecedorBean();
				fornecedor.setEmail(rs.getString("EMAIL"));
				fornecedor.setTipo(tipoBean);
				listaFornecedor.add(fornecedor);
			}
		} catch (Exception e) {
			throw e;
		}
		return listaFornecedor;
	}

	@Override
	public void exluir(P p) throws Exception {
		try {
			query = SQLConfiguracao.getInstance()
					.getValor("excluir_fornecedor");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	}

	public void aprovaFornecedor(final P p) throws Exception {
		try {
			query = SQLConfiguracao.getInstance().getValor("aprova_usuario");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getUsuario().getCodigo() + "");
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	};

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> filtraFornecedores(P p) throws Exception {
		List<P> listaFornecedores = new ArrayList<P>();
		FornecedorBean fornecedor;
		UsuarioBean usuario;
		TipoBean tipo;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"filtra_fornecedores");
			if (p != null) {
				if (p.getUsuario() != null && p.getUsuario().getAtivo() != null
						&& !"".equals(p.getUsuario().getAtivo().trim())) {
					query += " AND U.ATIVO = '"
							+ p.getUsuario().getAtivo().trim() + "'";
				}
				if (p.getNome() != null && !"".equals(p.getNome().trim())) {
					query += " AND F.RAZAO LIKE '" + p.getNome().trim() + "%%'";
				}
				if (p.getContato() != null && !"".equals(p.getContato().trim())) {
					query += " AND F.CONTATO LIKE '" + p.getContato().trim()
							+ "%%'";
				}
				if (p.getCnpj() != null && !"".equals(p.getCnpj().trim())) {
					query += " AND F.CNPJ LIKE '" + p.getCnpj().trim() + "%%'";
				}
				if (p.getTipo() != null && p.getTipo().getCodigo() != 0) {
					query += " AND F.IDTIPO = " + p.getTipo().getCodigo();
				}
				if (p.getCodigo() != null && p.getCodigo() != 0) {
					query += " AND F.IDFORN = " + p.getCodigo();
				}
			}
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			while (rs.next()) {
				tipo = new TipoBean();
				tipo.setCodigo(rs.getLong("IDTIPO"));
				tipo.setDescricao(rs.getString("DESCRICAO"));
				usuario = new UsuarioBean();
				usuario.setAtivo(rs.getString("ATIVO"));
				usuario.setCodigo(rs.getLong("IDUSER"));
				usuario.setLogin(rs.getString("LOGIN"));
				usuario.setSenha(rs.getString("SENHA"));
				usuario.setTipo(rs.getString("TIPO"));
				usuario.setBloqueado(rs.getString("BLOQUEADO"));
				fornecedor = new FornecedorBean();
				fornecedor.setCnpj(rs.getString("CNPJ"));
				fornecedor.setCodigo(rs.getLong("IDFORN"));
				fornecedor.setContato(rs.getString("CONTATO"));
				fornecedor.setEmail(rs.getString("EMAIL"));
				fornecedor.setFone(rs.getString("FONE"));
				fornecedor.setFone2(rs.getString("FONE2"));
				fornecedor.setNome(rs.getString("RAZAO"));
				fornecedor.setTipo(tipo);
				fornecedor.setUsuario(usuario);
				listaFornecedores.add((P) fornecedor);
			}
			return listaFornecedores;
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	}

	@Override
	public List<FornecedorBean> buscaOrcamentosFornecedor(OrcamentoBean orca)
			throws Exception {

		List<FornecedorBean> fornecedores = new ArrayList<FornecedorBean>();
		FornecedorBean fornecedor = null;
		List<CotacaoBean> cotacoes = null;
		ItemOrcamentoBean item = null;
		CotacaoBean cotacao = null;
		ProdutoBean produto = null;
		Double totalCotacao = null;

		conn = GerenciadorConexao.getConexao();
		query = SQLConfiguracao.getInstance().getValor(
				"localiza_fornecedores_do_orcamento");
		query += " AND I.IDITE IN (";
		for (int i = 0; i < orca.getItensOrcamento().size(); i++) {
			query += orca.getItensOrcamento().get(i).getNumero() + ",";
		}
		query = query.substring(0, query.trim().length() - 1);
		query += ") ORDER BY F.IDFORN";
		ps = conn.prepareStatement(query, ResultSet.CONCUR_UPDATABLE);
		rs = ps.executeQuery();
		long aux = 0;
		while (rs.next()) {
			if (aux == 0) {
				totalCotacao = 0.00;
				fornecedor = new FornecedorBean();
				fornecedor.setCodigo(rs.getLong("IDFORN"));
				fornecedor.setNome(rs.getString("RAZAO").trim());
				fornecedor.setContato(rs.getString("CONTATO").trim());
				fornecedor.setEmail(rs.getString("EMAIL").trim());
				fornecedor.setCnpj(rs.getString("CNPJ").trim());
				fornecedor.setFone(rs.getString("FONE").trim());
				cotacoes = new ArrayList<CotacaoBean>();
				aux = fornecedor.getCodigo();
			} else {
				cotacoes.add(cotacao);
				if (rs.getLong("IDFORN") == aux) {
					// cotacoes.add(cotacao);
				} else {
					Collections.sort(cotacoes);
					fornecedor.setListaCotacao(cotacoes);
					fornecedor.setValorTotal(totalCotacao);
					fornecedores.add(fornecedor);

					totalCotacao = 0.00;
					fornecedor = new FornecedorBean();
					fornecedor.setCodigo(rs.getLong("IDFORN"));
					fornecedor.setNome(rs.getString("RAZAO").trim());
					fornecedor.setContato(rs.getString("CONTATO").trim());
					fornecedor.setEmail(rs.getString("EMAIL").trim());
					fornecedor.setCnpj(rs.getString("CNPJ").trim());
					fornecedor.setFone(rs.getString("FONE").trim());
					cotacoes = new ArrayList<CotacaoBean>();
					aux = fornecedor.getCodigo();
				}
			}
			produto = new ProdutoBean();
			produto.setCodigo(rs.getLong("IDPROD"));
			produto.setDescricao(rs.getString("DESCRICAO").trim());
			produto.setUnidadeMedida(rs.getString("UNIMEDIDA").trim());
			produto.setMarca(rs.getString("MARCA"));
			item = new ItemOrcamentoBean();
			item.setNumero(rs.getLong("IDITE"));
			item.setQuantidade(rs.getDouble("QUANTIDADE"));
			item.setProduto(produto);
			cotacao = new CotacaoBean();
			cotacao.setCodigo(rs.getLong("IDITE"));
			cotacao.setFormaPagamento(new FormaPagamentoBean(rs
					.getString("METODO_PAGAMENTO"), rs
					.getString("FORMA_PAGAMENTO")));
			cotacao.setItemOrcamento(item);
			cotacao.setPrazoEntrega(rs.getString("PRAZO_ENTREGA").trim());
			cotacao.setTipoFrete(rs.getString("TIPO_FRETE"));
			cotacao.setValorUnitario(rs.getDouble("VALORUNI"));
			cotacao.setFornecedor(fornecedor);
			totalCotacao += cotacao.getValorUnitario();

			if (rs.next()) {
				rs.previous();
			} else {
				cotacoes.add(cotacao);
				Collections.sort(cotacoes);
				fornecedor.setListaCotacao(cotacoes);
				fornecedor.setValorTotal(totalCotacao);
				fornecedores.add(fornecedor);
			}

		}

		return fornecedores;
	}

	@Override
	public String buscaEmails(Map<String, String> param) throws Exception {
		String retorno = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_emails_fornecedores");
			ps = conn.prepareStatement(query);
			ps.setString(1, param.get("IDITEM"));
			rs = ps.executeQuery();
			if (rs.next()) {
				retorno = rs.getString("EMAILS");
			}
		} catch (Exception e) {
			throw e;
		}

		return retorno;
	}

	public List<FornecedorBean> buscaFornecedor(Map<String,String> param) throws Exception {
		FornecedorBean p = null;
		List<FornecedorBean> forns = new ArrayList<FornecedorBean>();
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_fornecedor_nome");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setString(1, param.get("NOME")+"%");
			rs = ps.executeQuery();
			while (rs.next()) {
				p = new FornecedorBean();
				p.setCnpj(rs.getString("CNPJ"));
				p.setCodigo(rs.getLong("IDFORN"));
				p.setContato(rs.getString("CONTATO"));
				p.setEmail(rs.getString("EMAIL"));
				p.setFone(rs.getString("FONE"));
				p.setFone2(rs.getString("FONE2"));
				p.setNome(rs.getString("RAZAO"));
				forns.add(p);
			}

		} catch (Exception e) {
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}

		return forns;
	};
}
